接著呢,我們繼續把上傳照片的功能做出來。首先是希望能在註冊的時候,能夠取得相簿的照片,然後把他上傳到我們昨天連線的storage,最後再將url回傳,將圖片顯示於UI上。
我們進到RegisterViewController
看,當按下註冊的按鈕的時候,若這個使用者帳號沒有被使用過,就會進行建立帳號,也就是此時對資料庫做更動。
Trace到insertUser
這個方法,發現剛好這就是先前一直沒有解到的bug。其實也不難,但我對closure還沒完全解鎖,所以也不知道該怎麼補上完整的程式。
因為現在的方法已經變成這樣
public func insertUser(with user: ChatAppUser, completion: @escaping(Bool) -> Void)
因此在其他地方呼叫時也要一併加上先前沒有寫進去的參數。此時就會想,以前開發c#的時候都可以用resharper哪,回不去了手動加參數的歲月了
快捷鍵cmd+sft+F,可以搜尋整個專案中的被使用到方法的地方。
接著就能找到先前出現bug的地方!好感動!!!
我們將原本此處insertUser
的參數with
抽出來,即chatUser
。
let chatUser = ChatAppUser (firstName: firstname,
lastName: lastname,
emailAddress: email)
接著加上缺少的completion
,當完成的時候,我們就將圖片使用昨天寫的方法uploadProfilePicture
上傳,上傳也成功後就根據回傳的url將圖片存在快取裡。
DatabaseManager.shared.insertUser(with: chatUser, completion: { success in
if success {
// upload image
guard let image = strongSelf.imageView.image, let data = image.pngData() else {
return
}
let fileName = chatUser.profilePictureFileName
StorageManager.shared.uploadProfilePicture(with: data, fileName: fileName, completion: { result in
switch result {
case .success(let downloadUrl):
// set in cache
UserDefaults.standard.set(downloadUrl, forKey: "profile_picture_url")
print(downloadUrl)
case .failure(let error):
print("Storage manager error: \(error)")
}
})
}
})
第211行的fileName,是這次新增的model property。
舉例來說,若我們希望檔名存成a8udej-gmail-com_profile_picture.jpg
,即使用資料庫的key值safeEmail
來作為檔名。
var profilePictureFileName: String {
return "\(safeEmail)_profile_picture.png"
}
可以執行了!!!!
此時再開模擬器,就可以跑了~可喜可賀呀
雖然這個功能尚未完善,不過目前可以回到對話繼續開發,在來日不多的時日中,希望可以把對話功能先開發完XDDD
若上述內容有誤或可以改進的部分,歡迎留言以及提出任何指教~
謝謝 ヘ| ´ω` |ノ